עזרה עם ms-sql
בשונה מmy-sql הכל מסובך!
דבר ראשון לעשות load של מידע מקבצי csv/txt.. כאשר קבצי הtxt מקודדים כutf8 הכל עולה לDB כג'יבריש!
הקוליישן של הDB מוגדר latin1_CS_AS וכל תא שמכיל עברית נבנה כ NvarChar..
ועדיין אין עברית עד שלא שומרים מחדש את קבצי הטקסט כANSI ועושים LOAD מחדש..
זה תהליך מסורבל ולא עמיד בLOAD ששרתים עושים שהכל ישתבש
זה קטע הקוד
BULK
INSERT test
FROM '123.txt'
WITH
(
DATAFILETYPE = 'char',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
CODEPAGE ='1255'
)
GO
דבר שני..
אני מנסה להגדיר ללא הצלחה תאים כאינקדס KEY פשוט מה שMYSQL עובד פשוט וקל..
עוד דבר כל LIKE שאני מבצע לא תופס על עברית משום מה...
חייב את העזרה שלכם .. ושכל העולם יעבור כבר לDB אחד
יום טוב תודה רבה
8 תשובות
1. כמו שעלית על זה נכון, או שצריך לשמור את כל הקבצים ב ansi כדי שהקידוד שלהם יתאים ל collation של המסד, או לשנות את ה collation של המסד ל utf8 . שזה בלתי אפשרי, כיוון ש sql server עובד רק עם utf-16 (ואגב, לשדות מסוג nvarcha כבר מוגדר בצורה אוטומטית collation של utf-16)
ככה שבמילים פשוטות - אין שום דבר שאתה יכול לעשות חוץ מלהפוך את הקובץ ל utf-16 לפני שאתה מפעיל עליו את ה bulk insert
2. מה הפקודה שאתה מנסה להריץ?
אינדקס פרימיטיבי פשוט, לא מפתח ראשי, לא כלום.
ב sqlserver יש הרבה יותר סוגים של אינדקסים וכל אחד מהם יכול להיות מוגבל למלא דברים ומלא בהרבה אופציות שונות מבלבד ה"עמודה".
מפתח ראשי עם הפקודה הבאה:
ADD CONSTRAINT pk_whatever_name PRIMARY KEY(columnName)
3. עוד פעם, השאילת משווה נתונים שאתה נותן לה ב utf-8 לאומת נתונים ששמורים במסד בתור utf-16.
גם לזה אין באמת פתרון, חוץ מלקודד את המחרוזת שאתה עושה לה LIKE לקידוד אחר (utf-16) לפני שאתה שולח אותה למסד.
באופן כללי ריבוי שפות זה לא הצד החזק של sqlserver.
ואם אתה חייב להישתמש בו, תצטרך לעשות הרבה קונבטרציות של קידודים.
אם לא, לך על postgresql ושכח מכל הבעיות האלה.
תודה על העזרה..
שאלה כזאת.. אולי עדיף להשאיר במסד ג'יבריש ובכל חיבור לעשות המרות לקידוד המתאים?
ניסיתי לעשות ששליפה תתבצע בג'יבריש ואחרי זה תרגום שלה יתבצע דרך הPHP לעברית
לא ממש הולך .. זה חותך שורות לא מתרגם כמו שצריך .. וצפוי לי עוד הרבה כאב ראש מכל הסיפור הזה..
מה אתה אומר?
תודה
אני אומר שאם אתה הולך לעבוד עם sqlserver ורק עם עברית (ולא שום שפה אחרת) - אז תעבוד עם ansii
ותשנה את ה collation ל Hebrew_CI_AI ותקודד את הקבצים שאתה מכניס למסד ל Windows-1255 עם iconv.
כנ"ל לגבי קבצי הקוד וההדרים שנשלחים לדפדפן.
ועוד משהו אני לוקח ג'יבריש מהמסד ומנסה להריץ שאילתה במסד על אותו הטקסט ושימצא אותו וכלום..
אני מרגיש עכשיו בשנת 2000 עם כל הבעיות תאימות בקידודים ... איזה עולם הזוי!
דבר שני ..שיניתי את הDB ל Hebrew_CI_AI+תאימות קבצים לansi ..
Load מתבצע על 1255 ואפילו אין צורך בקידוד חוזר לUTF8 או ל1255 בקבצי קוד לבצע שליפות
כרגע זה פתרון זמני שעובד.. אני אצטרך לחשוב בהמשך על המרה דרך השרת מTXT UTF8 לקובץ טקסט ANSI ..יש אפשרות כזאת און דה פליי או מצריך פרוצדורה שמטפלת במחרוזות ושומרת עם קידוד אחר??
תודה רבה גבר!
ממה שבדקתי הוא משבש מחרוזות מעל גודל מסויים...
אני מכוון לקבצים בגדלי גיגה ומעלה שבכל קובץ מעל 16 מיליון רשומות... לא יעשה בעיה?
דרך אגב לא צריך לבצע קידוד אחרי שליפות ניתן להכניס את זה לקונייקשן סטרינג של הSQL